package ru.compft.common.parser;

import ru.compft.common.utils.GlobalConstants;
import ru.compft.common.utils.JAXBUtils;

import java.io.*;

/**
 * User: VVasiliev
 * Date: 18.08.2011
 * Time: 13:49:06
 * <p/>
 * Парсер XML файлов, для чтения и записи объектов
 */
public class XmlFileParser {
    /**
     * Получаем "корневой" объект из XML файла
     *
     * @param path
     * @param fileName
     * @return
     */
    public static Object readJAXBElementFromXml(Class cls, String path, String fileName) {
        final String fullFileName = path + GlobalConstants.SLASH + fileName;
        return readXmlFileAsObject(cls, fullFileName);
    }

    /**
     * Пишем объект в XML файла
     *
     * @param path
     * @param fileName
     */
    public static void writeJAXBElementToXml(Object root, Class cls, String path, String fileName) {
        File file = new File(path);
        if (!file.exists()) file.mkdirs();

        final String fullFileName = path + GlobalConstants.SLASH + fileName;
        writeObjectToXmlFile(root, cls, fullFileName);
    }

    /**
     * Читаем из файла объект определенного класса
     *
     * @param cls
     * @param fullFileName
     * @return
     */
    public static Object readXmlFileAsObject(Class cls, String fullFileName) {
        File file = new File(fullFileName);
        InputStream is = null;
        try {
            is = new FileInputStream(file);
            return JAXBUtils.unmarshalling(cls, is);
        } catch (Exception e) {
            // игнорируем - оно запишется в лог через аспект
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    // ignore
                }
            }
        }
        return null;
    }

    /**
     * Пишем в файл объект определенного класса
     *
     * @param root
     * @param cls
     * @param fullFileName
     */
    public static void writeObjectToXmlFile(Object root, Class cls, String fullFileName) {
        File file = new File(fullFileName);
        OutputStream os = null;
        try {
            if (!file.exists()) file.createNewFile();
            os = new FileOutputStream(file);

            JAXBUtils.marshalling(root, cls, os);
        } catch (Exception e) {
            // игнорируем - оно запишется в лог через аспект
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    // ignore
                }
            }
        }
    }
}
